home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / sbprolog / sbp.zoo / sbp_v3.1 / auxil / portable.c < prev    next >
C/C++ Source or Header  |  1992-02-16  |  4KB  |  140 lines

  1. /* 
  2. This file is public domain.
  3.                                    -- Rahul Dhesi 1991/07/07
  4. */
  5.  
  6. typedef char BYTE;      /* MUST be an 8-bit value */
  7.  
  8. #include "zoo.h"
  9. #include "booz.h"
  10. #include <stdio.h>
  11.  
  12. long to_long ();
  13. int to_int ();
  14. int b_to_zooh();
  15. int b_to_dir();
  16.  
  17. /**********************
  18. to_long() converts four consecutive bytes, in order of increasing
  19. significance, to a long integer.  It is used to make Zoo independent of the
  20. byte order of the system.  
  21. */
  22. long to_long(BYTE data[])
  23. {
  24.    long retval;
  25.    retval = ((unsigned) data[2] & 0xff) | 
  26.       (((unsigned) data[3] & 0xff) << 8);
  27.    retval <<= 16;
  28.    retval |= (((unsigned) data[0] & 0xff) | 
  29.       (((unsigned) data[1] & 0xff) << 8));
  30.    return (retval);
  31. }
  32.  
  33. /**********************
  34. to_int() converts two consecutive bytes, in order of increasing
  35. significance, to an integer, in a machine-independent manner
  36. */
  37. int to_int(BYTE data[])
  38. {
  39.    return (int) (((unsigned) data[0] & 0xff) | 
  40.       ((unsigned) (data[1] & 0xff) << 8));
  41. }
  42.  
  43. /**********************
  44. Function rd_zooh() reads a Zoo archive header in a machine-dependent manner,
  45. from an open file.
  46. */
  47. int rd_zooh (struct zoo_header *header, FILE *zoofile)
  48. {
  49.    int status;
  50.    BYTE bytes[SIZ_ZOOH];
  51.    status = fread((char *) bytes, 1, SIZ_ZOOH, zoofile);
  52.    b_to_zooh (header, bytes);
  53.    return status;
  54. }
  55.  
  56. /**********************
  57. Function rd_dir() reads a directory entry in a machine-independent manner
  58. from an open file.
  59. */
  60.  
  61. char long_name[1024];
  62.  
  63. int rd_dir(struct direntry *direntry, FILE *zoofile)
  64. {
  65.    int status;
  66.      BYTE bytes[MAXDIRSIZE];
  67.  
  68.      status = fread((char *) bytes, 1, MAXDIRSIZE, zoofile);
  69.      b_to_dir (direntry, bytes);
  70.  
  71.      if( strlen(direntry->dirname) ) {
  72.          strcat(strcpy(long_name,direntry->dirname),"/");
  73.      } else {
  74.          long_name[0]='\0';
  75.      }
  76.  
  77.      if( strlen(direntry->lfname) ) {
  78.          strcat(long_name,direntry->lfname);
  79.      } else {
  80.          strcat(long_name,direntry->fname);
  81.      }
  82.  
  83.      return (status);
  84. }
  85.  
  86. /***********************
  87. b_to_zooh() converts an array of BYTE to a zoo_header structure.
  88. */
  89. int b_to_zooh (struct zoo_header *zoo_header, BYTE bytes[])
  90. {
  91.    int i;
  92.    for (i = 0; i < SIZ_TEXT; i++)
  93.       zoo_header->text[i] = bytes[TEXT_I + i];
  94.      zoo_header->zoo_tag = to_long(&bytes[ZTAG_I]);
  95.      zoo_header->zoo_start = to_long(&bytes[ZST_I]);
  96.    zoo_header->zoo_minus = to_long(&bytes[ZSTM_I]);
  97.    zoo_header->major_ver = bytes[MAJV_I];
  98.    zoo_header->minor_ver = bytes[MINV_I];
  99. }
  100.  
  101. /* b_to_dir() converts bytes to directory entry structure */
  102. int b_to_dir(struct direntry *direntry, BYTE bytes[])
  103. {
  104.    int i;
  105.      direntry->zoo_tag = to_long(&bytes[DTAG_I]);
  106.    direntry->type = bytes[DTYP_I];
  107.    direntry->packing_method = bytes[PKM_I];
  108.    direntry->next = to_long(&bytes[NXT_I]);
  109.    direntry->offset = to_long(&bytes[OFS_I]);
  110.    direntry->date = to_int(&bytes[DAT_I]);
  111.    direntry->time = to_int(&bytes[TIM_I]);
  112.    direntry->file_crc = to_int(&bytes[CRC_I]);
  113.    direntry->org_size = to_long(&bytes[ORGS_I]);
  114.    direntry->size_now = to_long(&bytes[SIZNOW_I]);
  115.    direntry->major_ver = bytes[DMAJ_I];
  116.    direntry->minor_ver = bytes[DMIN_I];
  117.    direntry->deleted = bytes[DEL_I];
  118.    direntry->comment = to_long(&bytes[CMT_I]);
  119.    direntry->cmt_size = to_int(&bytes[CMTSIZ_I]);
  120.    for (i = 0; i < FNM_SIZ; i++)
  121.       direntry->fname[i] = bytes[FNAME_I + i];
  122.  
  123.    /* start by assuming variable part is zero bytes */
  124.    direntry->var_dir_len = direntry->dir_crc    = 0;
  125.    direntry->namlen      = direntry->dirlen     = 0;
  126.    direntry->lfname[0]   = direntry->dirname[0] = '\0';
  127.  
  128.      if (direntry->type == 2) {
  129.             direntry->var_dir_len = to_int(&bytes[VARDIRLEN_I]);
  130.             if (direntry->var_dir_len > 0)
  131.                  direntry->namlen = bytes[NAMLEN_I];
  132.       if (direntry->var_dir_len > 1)
  133.          direntry->dirlen = bytes[DIRLEN_I];
  134.       for (i = 0; i < direntry->namlen; i++)
  135.          direntry->lfname[i] = bytes[LFNAME_I + i];
  136.       for (i = 0; i < direntry->dirlen; i++)
  137.          direntry->dirname[i] = bytes[DIRNAME_I + direntry->namlen + i];
  138.         }
  139. }
  140.